package com.sayice.robotconflict.game.object.property;

import com.sayice.robotconflict.common.util.MathUtil;

/**
 * 方向
 *
 * @author shubing
 */
public class Direction {
    /**
     * x方向占比
     */
    private volatile int x;
    
    /**
     * y方向占比
     */
    private volatile int y;
    
    /**
     * 创建方向 (会先处理为最简形式)
     *
     * @param x x方向占比
     * @param y y方向占比
     */
    public Direction(int x, int y) {
        set(x, y);
    }
    
    public int getX() {
        return x;
    }
    
    public int getY() {
        return y;
    }
    
    /**
     * 设置方向 (会先处理为最简形式)
     *
     * @param x x方向占比
     * @param y y方向占比
     */
    public void set(double x, double y) {
        int intX = (int) Math.round(Math.copySign(Math.max(Math.abs(x), 1), x));
        int intY = (int) Math.round(Math.copySign(Math.max(Math.abs(y), 1), y));
        set(intX, intY);
    }
    
    /**
     * 设置方向 (会先处理为最简形式)
     *
     * @param x x方向占比
     * @param y y方向占比
     */
    public void set(int x, int y) {
        if (x == 0 && y == 0) {
            throw new IllegalArgumentException("x方向占比和y方向占比不能同时为0");
        }
        int gcd = MathUtil.gcd(Math.abs(x), Math.abs(y));
        if (gcd != 0) {
            x /= gcd;
            y /= gcd;
        }
        this.x = x;
        this.y = y;
    }
    
    /**
     * 获取x方向分速度
     *
     * @param speed 速度
     * @return x方向分速度
     */
    public double xSpeedOf(double speed) {
        double xRatio = Math.abs(x);
        double yRatio = Math.abs(y);
        double totalRatio = xRatio + yRatio;
        return Math.copySign(speed * (xRatio / totalRatio), x);
    }
    
    /**
     * 获取y方向分速度
     *
     * @param speed 速度
     * @return y方向分速度
     */
    public double ySpeedOf(double speed) {
        double xRatio = Math.abs(x);
        double yRatio = Math.abs(y);
        double totalRatio = xRatio + yRatio;
        return Math.copySign(speed * (yRatio / totalRatio), y);
    }
    
    @Override
    public String toString() {
        return "Direction{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }
}